package com.longtop.framework.sys.user.service;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.longtop.framework.base.BaseService;
import com.longtop.framework.common.Constant;
import com.longtop.framework.common.QueryConditions;
import com.longtop.framework.common.QueryResult;
import com.longtop.framework.security.BaseCheckedException;
import com.longtop.framework.security.SessionObject;
import com.longtop.framework.sys.user.model.TSysUserGy;

public class UserGyService extends BaseService {

	public static final String BEAN_ID = "userGyService";

	/**
	 * 保存、修改、删除一起做！
	 * 
	 * @param changeMap
	 *            对象列表，有三个值，删除主键列表、更新bean的列表、新增bean的列表
	 * @param sessionObject
	 * @return 操作成功受影响的记录数，有三个值，插入成功的记录数、更新成功的记录数、删除成功的记录数
	 */
	public Integer[] saveUserGy(Map changeMap, SessionObject sessionObject) throws BaseCheckedException {

		// 插入成功的记录数、更新成功的记录数、删除成功的记录数
		int insertCount = 0;
		int updateCount = 0;
		int deleteCount = 0;

		// 删除主键列表、更新bean的列表、新增bean的列表
		List insertBeanList = (ArrayList) changeMap.get(Constant.INSERT_BEAN_LIST);
		List updateBeanList = (ArrayList) changeMap.get(Constant.UPDATE_BEAN_LIST);
		String idList = (String) changeMap.get(Constant.ID_LIST);

		TSysUserGy tSysUserGy;
		Iterator iterator;

		// 批量插入记录
		if (insertBeanList.size() > 0) {
			iterator = insertBeanList.iterator();
			while (iterator.hasNext()) {
				tSysUserGy = (TSysUserGy) iterator.next();
				if (isAllocationLegal(tSysUserGy))
					throw new BaseCheckedException("新增失败，时间不允许存在交叉。");
				tSysUserGy.setCreateUserId(sessionObject.getUserId());
				tSysUserGy.setCreateTime(new Date());
				super.save(tSysUserGy);
				insertCount++;
			}
		}

		// 批量更新记录
		if (updateBeanList.size() > 0) {
			iterator = updateBeanList.iterator();
			while (iterator.hasNext()) {
				tSysUserGy = (TSysUserGy) iterator.next();
				if (isAllocationLegal(tSysUserGy))
					throw new BaseCheckedException("更新失败，时间不允许存在交叉。");
				tSysUserGy.setUpdateTime(new Date());
				tSysUserGy.setUpdateUserId(sessionObject.getUserId());
				super.update(tSysUserGy);
				updateCount++;
			}
		}

		// 批量删除记录
		if (idList.length() > 0) {
			String sql = "delete from TSysUserGy where id in(" + idList + ")";
			deleteCount = super.batchUpdate(sql);
		}

		return new Integer[] { new Integer(insertCount), new Integer(updateCount), new Integer(deleteCount) };
	}

	/**
	 * 验证时间是否交叉
	 * 
	 * @return
	 */
	public boolean isAllocationLegal(TSysUserGy sysUserGy) {
		boolean flag = false;
		String hqlselect = "from TSysUserGy where gyId='" + sysUserGy.getGyId() + "'" +" and id <> '"+ sysUserGy.getId()+"'";
		Date startDate = sysUserGy.getStartDate();
		Date endDate = sysUserGy.getEndDate();
		List list = this.queryAll(hqlselect);
		if (list.size() > 0) {
			for (int i = 0; i < list.size(); i++) {
				TSysUserGy oldSysUserGy = (TSysUserGy) list.get(i);
				Date oldStartDate = oldSysUserGy.getStartDate();
				Date oldEndDate = oldSysUserGy.getEndDate();
				if ((oldEndDate.getTime() >= startDate.getTime() && (oldEndDate.getTime() <= endDate.getTime())) || (oldStartDate.getTime() >= startDate.getTime() && (oldStartDate.getTime() <= endDate.getTime()))) {
					flag = true;
					break;
				}
			}
		}
		return flag;

	}

	/**
	 * 依据条件，读取代码类别列表
	 * 
	 * @param queryConditions
	 *            查询条件
	 * @param pageNo
	 *            查询结果的起始页码。
	 * @param pageSize
	 *            查询结果的最大行数。如果不需要，则设置为-1
	 * @return
	 */
	public QueryResult loadUserGy(QueryConditions queryConditions, int pageNo, int pageSize) {

		// String orderBy = "starDate asc";
		// queryConditions.setOrderBy(orderBy);

		return this.loadByConditions(queryConditions, pageNo, pageSize, TSysUserGy.class);
	}
}